--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sx128x.cpp 470f4f4d0963da4e202a6af256d727c56f76a84b (470f4f4d) Text, 19.31 KB
T8b949e// Copyright (c) Sandeep Mistry. All rights reserved.
T8b949e// Licensed under the MIT license.
T8b949e// Modifications and additions copyright 2024 by Mark Qvist
T8b949e// Obviously still under the MIT license.
Tff7b72#Tff7b72include T8b949e"sx128x.h"
Tff7b72#Tff7b72include T8b949e"Boards.h"
Tff7b72#Tff7b72define MCU_1284P 0x91
Tff7b72#Tff7b72define MCU_2560 0x92
Tff7b72#Tff7b72define MCU_ESP32 0x81
Tff7b72#Tff7b72define MCU_NRF52 0x71
Tff7b72#Tff7b72if defined(__AVR_ATmega1284P__)
Tff7b72#Tff7b72define PLATFORM PLATFORM_AVR
Tff7b72#Tff7b72define MCU_VARIANT MCU_1284P
Tff7b72#Tff7b72elif defined(__AVR_ATmega2560__)
Tff7b72#Tff7b72define PLATFORM PLATFORM_AVR
Tff7b72#Tff7b72define MCU_VARIANT MCU_2560
Tff7b72#Tff7b72elif defined(ESP32)
Tff7b72#Tff7b72define PLATFORM PLATFORM_ESP32
Tff7b72#Tff7b72define MCU_VARIANT MCU_ESP32
Tff7b72#Tff7b72elif defined(NRF52840_XXAA)
Tff7b72#Tff7b72define PLATFORM PLATFORM_NRF52
Tff7b72#Tff7b72define MCU_VARIANT MCU_NRF52
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef MCU_VARIANT
Tff7b72#Tff7b72error No MCU variant defined, cannot compile
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32 and !defined(CONFIG_IDF_TARGET_ESP32S3)
Tff7b72#Tff7b72include T8b949e"hal/wdt_hal.h"
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define ISR_VECT IRAM_ATTR
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define ISR_VECT
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define OP_RF_FREQ_8X 0x86
Tff7b72#Tff7b72define OP_SLEEP_8X 0x84
Tff7b72#Tff7b72define OP_STANDBY_8X 0x80
Tff7b72#Tff7b72define OP_TX_8X 0x83
Tff7b72#Tff7b72define OP_RX_8X 0x82
Tff7b72#Tff7b72define OP_SET_IRQ_FLAGS_8X 0x8D T8b949e// also provides info such as
T8b949e// preamble detection, etc for
T8b949e// knowing when it's safe to switch
T8b949e// antenna modes
Tff7b72#Tff7b72define OP_CLEAR_IRQ_STATUS_8X 0x97
Tff7b72#Tff7b72define OP_GET_IRQ_STATUS_8X 0x15
Tff7b72#Tff7b72define OP_RX_BUFFER_STATUS_8X 0x17
Tff7b72#Tff7b72define OP_PACKET_STATUS_8X 0x1D T8b949e// get snr & rssi of last packet
Tff7b72#Tff7b72define OP_CURRENT_RSSI_8X 0x1F
Tff7b72#Tff7b72define OP_MODULATION_PARAMS_8X 0x8B T8b949e// bw, sf, cr, etc.
Tff7b72#Tff7b72define OP_PACKET_PARAMS_8X 0x8C T8b949e// crc, preamble, payload length, etc.
Tff7b72#Tff7b72define OP_STATUS_8X 0xC0
Tff7b72#Tff7b72define OP_TX_PARAMS_8X 0x8E T8b949e// set dbm, etc
Tff7b72#Tff7b72define OP_PACKET_TYPE_8X 0x8A
Tff7b72#Tff7b72define OP_BUFFER_BASE_ADDR_8X 0x8F
Tff7b72#Tff7b72define OP_READ_REGISTER_8X 0x19
Tff7b72#Tff7b72define OP_WRITE_REGISTER_8X 0x18
Tff7b72#Tff7b72define IRQ_TX_DONE_MASK_8X 0x01
Tff7b72#Tff7b72define IRQ_RX_DONE_MASK_8X 0x02
Tff7b72#Tff7b72define IRQ_HEADER_DET_MASK_8X 0x10
Tff7b72#Tff7b72define IRQ_HEADER_ERROR_MASK_8X 0x20
Tff7b72#Tff7b72define IRQ_PAYLOAD_CRC_ERROR_MASK_8X 0x40
Tff7b72#Tff7b72define MODE_LONG_RANGE_MODE_8X 0x01
Tff7b72#Tff7b72define OP_FIFO_WRITE_8X 0x1A
Tff7b72#Tff7b72define OP_FIFO_READ_8X 0x1B
Tff7b72#Tff7b72define IRQ_PREAMBLE_DET_MASK_8X 0x80
Tff7b72#Tff7b72define REG_PACKET_SIZE 0x901
Tff7b72#Tff7b72define REG_FIRM_VER_MSB 0x154
Tff7b72#Tff7b72define REG_FIRM_VER_LSB 0x153
Tff7b72#Tff7b72define XTAL_FREQ_8X (double)52000000
Tff7b72#Tff7b72define FREQ_DIV_8X (double)pow(2.0, 18.0)
Tff7b72#Tff7b72define FREQ_STEP_8X (double)(XTAL_FREQ_8X Tff7b72/Tff7b72 FREQ_DIV_8X)
Tff7b72#Tff7b72if defined(NRF52840_XXAA)
Tff7b72extern Te6edf3SPIClass Te6edf3spiModemTb4b4b4;
Tff7b72#Tff7b72define SPI spiModem
Tff7b72#Tff7b72endif
Tff7b72extern Te6edf3SPIClass Te6edf3SPITb4b4b4;
Tff7b72#Tff7b72define MAX_PKT_LENGTH 255
Te6edf3sx128xTff7b72:Tff7b72:Te6edf3sx128xTb4b4b4(Tb4b4b4) Tff7b72:
Te6edf3_spiSettingsTb4b4b4(T79c0ff8E6Tb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4,
Te6edf3_ssTb4b4b4(Te6edf3LORA_DEFAULT_SS_PINTb4b4b4)Tb4b4b4, Te6edf3_resetTb4b4b4(Te6edf3LORA_DEFAULT_RESET_PINTb4b4b4)Tb4b4b4, Te6edf3_dio0Tb4b4b4(Te6edf3LORA_DEFAULT_DIO0_PINTb4b4b4)Tb4b4b4, Te6edf3_rxenTb4b4b4(Te6edf3LORA_DEFAULT_RXEN_PINTb4b4b4)Tb4b4b4, Te6edf3_busyTb4b4b4(Te6edf3LORA_DEFAULT_BUSY_PINTb4b4b4)Tb4b4b4,
Te6edf3_frequencyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_txpTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_sfTb4b4b4(T79c0ff0x50Tb4b4b4)Tb4b4b4,
Te6edf3_bwTb4b4b4(T79c0ff0x34Tb4b4b4)Tb4b4b4,
Te6edf3_crTb4b4b4(T79c0ff0x01Tb4b4b4)Tb4b4b4,
Te6edf3_packetIndexTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_preambleLengthTb4b4b4(T79c0ff18Tb4b4b4)Tb4b4b4,
Te6edf3_implicitHeaderModeTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_payloadLengthTb4b4b4(T79c0ff255Tb4b4b4)Tb4b4b4,
Te6edf3_crcModeTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_fifo_tx_addr_ptrTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_fifo_rx_addr_ptrTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_packetTb4b4b4(Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3_rxPacketLengthTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3_preinit_doneTb4b4b4(Tffa657falseTb4b4b4)Tb4b4b4,
Te6edf3_onReceiveTb4b4b4(Tffa657NULLTb4b4b4)
Tb4b4b4{
T8b949e// overide Stream timeout value
Te6edf3setTimeoutTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3sx128xTff7b72:Tff7b72:Te6edf3preInitTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// setup pins
Te6edf3pinModeTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
T8b949e// set SS high
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// check version (retry for up to 2 seconds)
Tffa657long Te6edf3start Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3version_msbTb4b4b4;
Tffa657uint8_t Te6edf3version_lsbTb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3startTb4b4b4) Tff7b72< T79c0ff2000Tb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3startTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3version_msb Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIRM_VER_MSBTb4b4b4)Tb4b4b4;
Te6edf3version_lsb Tff7b72= Te6edf3readRegisterTb4b4b4(Te6edf3REG_FIRM_VER_LSBTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3version_msb Tff7b72=Tff7b72= T79c0ff0xB7 Tff7b72&Tff7b72& Te6edf3version_lsb Tff7b72=Tff7b72= T79c0ff0xA9Tb4b4b4) Tff7b72|Tff7b72| Tb4b4b4(Te6edf3version_msb Tff7b72=Tff7b72= T79c0ff0xB5 Tff7b72&Tff7b72& Te6edf3version_lsb Tff7b72=Tff7b72= T79c0ff0xA9Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Te6edf3delayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3version_msb Tff7b72!Tff7b72= T79c0ff0xB7 Tff7b72|Tff7b72| Te6edf3version_lsb Tff7b72!Tff7b72= T79c0ff0xA9Tb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3version_msb Tff7b72!Tff7b72= T79c0ff0xB5 Tff7b72|Tff7b72| Te6edf3version_lsb Tff7b72!Tff7b72= T79c0ff0xA9Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Te6edf3_preinit_done Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3readRegisterTb4b4b4(Tffa657uint16_t Te6edf3addressTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3singleTransferTb4b4b4(Te6edf3OP_READ_REGISTER_8XTb4b4b4, Te6edf3addressTb4b4b4, T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3writeRegisterTb4b4b4(Tffa657uint16_t Te6edf3addressTb4b4b4, Tffa657uint8_t Te6edf3valueTb4b4b4)
Tb4b4b4{
Te6edf3singleTransferTb4b4b4(Te6edf3OP_WRITE_REGISTER_8XTb4b4b4, Te6edf3addressTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3singleTransferTb4b4b4(Tffa657uint8_t Te6edf3opcodeTb4b4b4, Tffa657uint16_t Te6edf3addressTb4b4b4, Tffa657uint8_t Te6edf3valueTb4b4b4)
Tb4b4b4{
Te6edf3waitOnBusyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3responseTb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3opcodeTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Tb4b4b4(Te6edf3address Tff7b72& T79c0ff0xFF00Tb4b4b4) Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3address Tff7b72& T79c0ff0x00FFTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3opcode Tff7b72=Tff7b72= Te6edf3OP_READ_REGISTER_8XTb4b4b4) Tb4b4b4{
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3response Tff7b72= Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3responseTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3rxAntEnableTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_txen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_txenTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_rxen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_rxenTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3txAntEnableTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_txen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_txenTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_rxen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_rxenTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3loraModeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// enable lora mode on the SX1262 chip
Tffa657uint8_t Te6edf3mode Tff7b72= Te6edf3MODE_LONG_RANGE_MODE_8XTb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_PACKET_TYPE_8XTb4b4b4, Tff7b72&Te6edf3modeTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3waitOnBusyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657unsigned Tffa657long Te6edf3time Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_busy Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3digitalReadTb4b4b4(Te6edf3_busyTb4b4b4) Tff7b72=Tff7b72= Te6edf3HIGHTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Tb4b4b4(Te6edf3time Tff7b72+ T79c0ff100Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
T8b949e// do nothing
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3executeOpcodeTb4b4b4(Tffa657uint8_t Te6edf3opcodeTb4b4b4, Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657uint8_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3waitOnBusyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3opcodeTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3executeOpcodeReadTb4b4b4(Tffa657uint8_t Te6edf3opcodeTb4b4b4, Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657uint8_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3waitOnBusyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3opcodeTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3writeBufferTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3waitOnBusyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3OP_FIFO_WRITE_8XTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3_fifo_tx_addr_ptrTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3_fifo_tx_addr_ptrTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3readBufferTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3waitOnBusyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3OP_FIFO_READ_8XTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(Te6edf3_fifo_rx_addr_ptrTb4b4b4)Tb4b4b4;
Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3SPITb4b4b4.Te6edf3transferTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3SPITb4b4b4.Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_ssTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setModulationParamsTb4b4b4(Tffa657uint8_t Te6edf3sfTb4b4b4, Tffa657uint8_t Te6edf3bwTb4b4b4, Tffa657uint8_t Te6edf3crTb4b4b4) Tb4b4b4{
T8b949e// because there is no access to these registers on the sx1280, we have
T8b949e// to set all these parameters at once or not at all.
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3sfTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3bwTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Te6edf3crTb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_MODULATION_PARAMS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72<Tff7b72= T79c0ff6Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(T79c0ff0x925Tb4b4b4, T79c0ff0x1ETb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72<Tff7b72= T79c0ff8Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(T79c0ff0x925Tb4b4b4, T79c0ff0x37Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72>Tff7b72= T79c0ff9Tb4b4b4) Tb4b4b4{
Te6edf3writeRegisterTb4b4b4(T79c0ff0x925Tb4b4b4, T79c0ff0x32Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3writeRegisterTb4b4b4(T79c0ff0x093CTb4b4b4, T79c0ff0x1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setPacketParamsTb4b4b4(Tffa657uint32_t Te6edf3preambleTb4b4b4, Tffa657uint8_t Te6edf3headermodeTb4b4b4, Tffa657uint8_t Te6edf3lengthTb4b4b4, Tffa657uint8_t Te6edf3crcTb4b4b4) Tb4b4b4{
T8b949e// because there is no access to these registers on the sx1280, we have
T8b949e// to set all these parameters at once or not at all.
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4;
T8b949e// calculate exponent and mantissa values for modem
Tffa657uint8_t Te6edf3e Tff7b72= T79c0ff1Tb4b4b4;
Tffa657uint8_t Te6edf3m Tff7b72= T79c0ff1Tb4b4b4;
Tffa657uint32_t Te6edf3preamblelenTb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3e Tff7b72<Tff7b72= T79c0ff15Tb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3m Tff7b72<Tff7b72= T79c0ff15Tb4b4b4) Tb4b4b4{
Te6edf3preamblelen Tff7b72= Te6edf3m Tff7b72* Tb4b4b4(Te6edf3powTb4b4b4(T79c0ff2Tb4b4b4,Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3preamblelen Tff7b72>Tff7b72= Te6edf3preambleTb4b4b4) Tff7b72breakTb4b4b4;
Te6edf3mTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3preamblelen Tff7b72>Tff7b72= Te6edf3preambleTb4b4b4) Tff7b72breakTb4b4b4;
Te6edf3m Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3eTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3e Tff7b72<Tff7b72< T79c0ff4Tb4b4b4) Tff7b72| Te6edf3mTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3headermodeTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Te6edf3lengthTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3crcTb4b4b4;
T8b949e// standard IQ setting (no inversion)
Te6edf3bufTb4b4b4[T79c0ff4Tb4b4b4] Tff7b72= T79c0ff0x40Tb4b4b4;
T8b949e// unused params
Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff6Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_PACKET_PARAMS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff7Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3sx128xTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tffa657unsigned Tffa657long Te6edf3frequencyTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
T8b949e// perform reset
Te6edf3digitalWriteTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_resetTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_rxen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_rxenTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_txen Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_txenTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_busy Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_busyTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_preinit_doneTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3preInitTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3idleTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3loraModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3rxAntEnableTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3setFrequencyTb4b4b4(Te6edf3frequencyTb4b4b4)Tb4b4b4;
T8b949e// set LNA boost
T8b949e// todo: implement this
T8b949e//writeRegister(REG_LNA, 0x96);
Te6edf3setModulationParamsTb4b4b4(Te6edf3_sfTb4b4b4, Te6edf3_bwTb4b4b4, Te6edf3_crTb4b4b4)Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
T8b949e// set output power to 2 dBm
Te6edf3setTxPowerTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
T8b949e// set base addresses
Tffa657uint8_t Te6edf3basebufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_BUFFER_BASE_ADDR_8XTb4b4b4, Te6edf3basebufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3endTb4b4b4(Tb4b4b4)
Tb4b4b4{
T8b949e// put in sleep mode
Te6edf3sleepTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// stop SPI
Te6edf3SPITb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_preinit_done Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3sx128xTff7b72:Tff7b72:Te6edf3beginPacketTb4b4b4(Tffa657int Te6edf3implicitHeaderTb4b4b4)
Tb4b4b4{
T8b949e// put in standby mode
Te6edf3idleTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3implicitHeaderTb4b4b4) Tb4b4b4{
Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_payloadLength Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3_fifo_tx_addr_ptr Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3sx128xTff7b72:Tff7b72:Te6edf3endPacketTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Te6edf3txAntEnableTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// put in single TX mode
Tffa657uint8_t Te6edf3timeoutTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_TX_8XTb4b4b4, Te6edf3timeoutTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_GET_IRQ_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
T8b949e// wait for TX done
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72& Te6edf3IRQ_TX_DONE_MASK_8XTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_GET_IRQ_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3yieldTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// clear IRQ's
Tffa657uint8_t Te6edf3maskTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3maskTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3maskTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3IRQ_TX_DONE_MASK_8XTb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_CLEAR_IRQ_STATUS_8XTb4b4b4, Te6edf3maskTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3modemStatusTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// imitate the register status from the sx1276 / 78
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_GET_IRQ_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3clearbufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& Te6edf3IRQ_PREAMBLE_DET_MASK_8XTb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657byte Tff7b72= Tffa657byte Tff7b72| T79c0ff0x01 Tff7b72| T79c0ff0x04Tb4b4b4;
T8b949e// clear register after reading
Te6edf3clearbufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0xFFTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72& Te6edf3IRQ_HEADER_DET_MASK_8XTb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657byte Tff7b72= Tffa657byte Tff7b72| T79c0ff0x02 Tff7b72| T79c0ff0x04Tb4b4b4;
T8b949e// clear register after reading
Te6edf3clearbufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0xFFTb4b4b4;
Tb4b4b4}
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_CLEAR_IRQ_STATUS_8XTb4b4b4, Te6edf3clearbufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657byteTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3currentRssiRawTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_CURRENT_RSSI_8XTb4b4b4, Tff7b72&Tffa657byteTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657byteTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3currentRssiTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_CURRENT_RSSI_8XTb4b4b4, Tff7b72&Tffa657byteTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3rssi Tff7b72= Tff7b72-Tffa657byte Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72return Te6edf3rssiTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetRssiRawTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_PACKET_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetRssiTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// may need more calculations here
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_PACKET_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3pkt_rssi Tff7b72= Tff7b72-Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72return Te6edf3pkt_rssiTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetRssiTb4b4b4(Tffa657uint8_t Te6edf3pkt_snr_rawTb4b4b4) Tb4b4b4{
T8b949e// may need more calculations here
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_PACKET_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3pkt_rssi Tff7b72= Tff7b72-Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72return Te6edf3pkt_rssiTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetSnrRawTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_PACKET_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tffa657float Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetSnrTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_PACKET_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657floatTb4b4b4(Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72* T79c0ff0.25Tb4b4b4;
Tb4b4b4}
Tffa657long Te6edf3sx128xTff7b72:Tff7b72:Te6edf3packetFrequencyErrorTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tffa657int32_t Te6edf3freqError Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// todo: implement this, page 120 of sx1280 datasheet
Tff7b72const Tffa657float Te6edf3fError Tff7b72= T79c0ff0.0Tb4b4b4;
Tff7b72return Tff7b72static_castTff7b72<Tffa657longTff7b72>Tb4b4b4(Te6edf3fErrorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657size_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3writeTb4b4b4(Tffa657uint8_t Tffa657byteTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3writeTb4b4b4(Tff7b72&Tffa657byteTb4b4b4, Tff7b72sizeofTb4b4b4(Tffa657byteTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657size_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3writeTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3_payloadLength Tff7b72+ Te6edf3sizeTb4b4b4) Tff7b72> Te6edf3MAX_PKT_LENGTHTb4b4b4) Tb4b4b4{
Te6edf3size Tff7b72= Te6edf3MAX_PKT_LENGTH Tff7b72- Te6edf3_payloadLengthTb4b4b4;
Tb4b4b4}
T8b949e// write data
Te6edf3writeBufferTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3_payloadLength Tff7b72= Te6edf3_payloadLength Tff7b72+ Te6edf3sizeTb4b4b4;
Tff7b72return Te6edf3sizeTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3availableTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3_rxPacketLength Tff7b72- Te6edf3_packetIndexTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3readTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff-1Tb4b4b4;
Tb4b4b4}
Tffa657uint8_t Tffa657byte Tff7b72= Te6edf3_packetTb4b4b4[Te6edf3_packetIndexTb4b4b4]Tb4b4b4;
Te6edf3_packetIndexTff7b72+Tff7b72+Tb4b4b4;
Tff7b72return Tffa657byteTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3sx128xTff7b72:Tff7b72:Te6edf3peekTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff-1Tb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3b Tff7b72= Te6edf3_packetTb4b4b4[Te6edf3_packetIndexTb4b4b4]Tb4b4b4;
Tff7b72return Te6edf3bTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3flushTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3onReceiveTb4b4b4(Tffa657voidTb4b4b4(Tff7b72*Te6edf3callbackTb4b4b4)Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3_onReceive Tff7b72= Te6edf3callbackTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3callbackTb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_dio0Tb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
T8b949e// set preamble and header detection irqs, plus dio0 mask
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff8Tb4b4b4]Tb4b4b4;
T8b949e// set irq masks, enable all
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0xFFTb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0xFFTb4b4b4;
T8b949e// set dio0 masks
Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3IRQ_RX_DONE_MASK_8XTb4b4b4;
T8b949e// set dio1 masks
Te6edf3bufTb4b4b4[T79c0ff4Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff5Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
T8b949e// set dio2 masks
Te6edf3bufTb4b4b4[T79c0ff6Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff7Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_SET_IRQ_FLAGS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
T8b949e//#ifdef SPI_HAS_NOTUSINGINTERRUPT
T8b949e// SPI.usingInterrupt(digitalPinToInterrupt(_dio0));
T8b949e//#endif
Te6edf3attachInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4, Te6edf3sx128xTff7b72:Tff7b72:Te6edf3onDio0RiseTb4b4b4, Te6edf3RISINGTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3detachInterruptTb4b4b4(Te6edf3digitalPinToInterruptTb4b4b4(Te6edf3_dio0Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e//#ifdef SPI_HAS_NOTUSINGINTERRUPT
T8b949e// SPI.notUsingInterrupt(digitalPinToInterrupt(_dio0));
T8b949e//#endif
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3receiveTb4b4b4(Tffa657int Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3size Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// tell radio payload length
Te6edf3_rxPacketLength Tff7b72= Te6edf3sizeTb4b4b4;
T8b949e//_payloadLength = size;
T8b949e//setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode);
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3rxAntEnableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3modeTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4}Tb4b4b4; T8b949e// continuous mode
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_RX_8XTb4b4b4, Te6edf3modeTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3idleTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tff7b72#Tff7b72if HAS_TCXO
T8b949e// STDBY_XOSC
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0x01Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e// STDBY_RC
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_STANDBY_8XTb4b4b4, Tff7b72&Tffa657byteTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3sleepTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tffa657uint8_t Tffa657byte Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_SLEEP_8XTb4b4b4, Tff7b72&Tffa657byteTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3enableTCXOTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// todo: need to check how to implement on sx1280
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3disableTCXOTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// todo: need to check how to implement on sx1280
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setTxPowerTb4b4b4(Tffa657int Te6edf3levelTb4b4b4, Tffa657int Te6edf3outputPinTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_PA == true
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72> Te6edf3pa_max_inputTb4b4b4) Tb4b4b4{ Te6edf3level Tff7b72= Te6edf3pa_max_inputTb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72else
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72> T79c0ff13Tb4b4b4) Tb4b4b4{
Te6edf3level Tff7b72= T79c0ff13Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3level Tff7b72< T79c0ff-18Tb4b4b4) Tb4b4b4{
Te6edf3level Tff7b72= T79c0ff-18Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3_txp Tff7b72= Te6edf3levelTb4b4b4;
Te6edf3level Tff7b72= Te6edf3level Tff7b72+ T79c0ff18Tb4b4b4;
Tffa657uint8_t Te6edf3tx_bufTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3tx_bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3levelTb4b4b4;
Te6edf3tx_bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0xE0Tb4b4b4; T8b949e// ramping time - 20 microseconds
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_TX_PARAMS_8XTb4b4b4, Te6edf3tx_bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3getTxPowerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3_txpTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setFrequencyTb4b4b4(Tffa657unsigned Tffa657long Te6edf3frequencyTb4b4b4) Tb4b4b4{
Te6edf3_frequency Tff7b72= Te6edf3frequencyTb4b4b4;
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tffa657uint32_t Te6edf3freq Tff7b72= Tb4b4b4(Tffa657uint32_tTb4b4b4)Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3frequency Tff7b72/ Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3FREQ_STEP_8XTb4b4b4)Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3freq Tff7b72>Tff7b72> T79c0ff16Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3freq Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3freq Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_RF_FREQ_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657uint32_t Te6edf3sx128xTff7b72:Tff7b72:Te6edf3getFrequencyTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// we can't read the frequency on the sx1280
Tffa657uint32_t Te6edf3frequency Tff7b72= Te6edf3_frequencyTb4b4b4;
Tff7b72return Te6edf3frequencyTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setSpreadingFactorTb4b4b4(Tffa657int Te6edf3sfTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72< T79c0ff5Tb4b4b4) Tb4b4b4{
Te6edf3sf Tff7b72= T79c0ff5Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72> T79c0ff12Tb4b4b4) Tb4b4b4{
Te6edf3sf Tff7b72= T79c0ff12Tb4b4b4;
Tb4b4b4}
Te6edf3_sf Tff7b72= Te6edf3sf Tff7b72<Tff7b72< T79c0ff4Tb4b4b4;
Te6edf3setModulationParamsTb4b4b4(Te6edf3sf Tff7b72<Tff7b72< T79c0ff4Tb4b4b4, Te6edf3_bwTb4b4b4, Te6edf3_crTb4b4b4)Tb4b4b4;
Te6edf3handleLowDataRateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657long Te6edf3sx128xTff7b72:Tff7b72:Te6edf3getSignalBandwidthTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3bw Tff7b72= Te6edf3_bwTb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3bwTb4b4b4) Tb4b4b4{
Tff7b72case T79c0ff0x34Tb4b4b4: Tff7b72return T79c0ff203.125E3Tb4b4b4;
Tff7b72case T79c0ff0x26Tb4b4b4: Tff7b72return T79c0ff406.25E3Tb4b4b4;
Tff7b72case T79c0ff0x18Tb4b4b4: Tff7b72return T79c0ff812.5E3Tb4b4b4;
Tff7b72case T79c0ff0x0ATb4b4b4: Tff7b72return T79c0ff1625E3Tb4b4b4;
Tb4b4b4}
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3handleLowDataRateTb4b4b4(Tb4b4b4)Tb4b4b4{
T8b949e// todo: do i need this??
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3optimizeModemSensitivityTb4b4b4(Tb4b4b4)Tb4b4b4{
T8b949e// todo: check if there's anything the sx1280 can do here
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setSignalBandwidthTb4b4b4(Tffa657long Te6edf3sbwTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff203.125E3Tb4b4b4) Tb4b4b4{
Te6edf3_bw Tff7b72= T79c0ff0x34Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff406.25E3Tb4b4b4) Tb4b4b4{
Te6edf3_bw Tff7b72= T79c0ff0x26Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbw Tff7b72<Tff7b72= T79c0ff812.5E3Tb4b4b4) Tb4b4b4{
Te6edf3_bw Tff7b72= T79c0ff0x18Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_bw Tff7b72= T79c0ff0x0ATb4b4b4;
Tb4b4b4}
Te6edf3setModulationParamsTb4b4b4(Te6edf3_sfTb4b4b4, Te6edf3_bwTb4b4b4, Te6edf3_crTb4b4b4)Tb4b4b4;
Te6edf3handleLowDataRateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3optimizeModemSensitivityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setCodingRate4Tb4b4b4(Tffa657int Te6edf3denominatorTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3denominator Tff7b72< T79c0ff5Tb4b4b4) Tb4b4b4{
Te6edf3denominator Tff7b72= T79c0ff5Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3denominator Tff7b72> T79c0ff8Tb4b4b4) Tb4b4b4{
Te6edf3denominator Tff7b72= T79c0ff8Tb4b4b4;
Tb4b4b4}
Te6edf3_cr Tff7b72= Te6edf3denominator Tff7b72- T79c0ff4Tb4b4b4;
T8b949e// todo: add support for new interleaving scheme, see page 117 of sx1280
T8b949e// datasheet
T8b949e// update cr values for sx1280's use
Te6edf3setModulationParamsTb4b4b4(Te6edf3_sfTb4b4b4, Te6edf3_bwTb4b4b4, Te6edf3_crTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setPreambleLengthTb4b4b4(Tffa657long Te6edf3lengthTb4b4b4)
Tb4b4b4{
Te6edf3_preambleLength Tff7b72= Te6edf3lengthTb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3lengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setSyncWordTb4b4b4(Tffa657int Te6edf3swTb4b4b4)
Tb4b4b4{
T8b949e// not implemented
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3enableCrcTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3_crcMode Tff7b72= T79c0ff0x20Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3disableCrcTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3_crcMode Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657byte Te6edf3sx128xTff7b72:Tff7b72:Te6edf3randomTb4b4b4(Tb4b4b4)
Tb4b4b4{
T8b949e// todo: implement
Tff7b72return T79c0ff-1Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setPinsTb4b4b4(Tffa657int Te6edf3ssTb4b4b4, Tffa657int Te6edf3resetTb4b4b4, Tffa657int Te6edf3dio0Tb4b4b4, Tffa657int Te6edf3busyTb4b4b4, Tffa657int Te6edf3rxenTb4b4b4, Tffa657int Te6edf3txenTb4b4b4)
Tb4b4b4{
Te6edf3_ss Tff7b72= Te6edf3ssTb4b4b4;
Te6edf3_reset Tff7b72= Te6edf3resetTb4b4b4;
Te6edf3_dio0 Tff7b72= Te6edf3dio0Tb4b4b4;
Te6edf3_busy Tff7b72= Te6edf3busyTb4b4b4;
Te6edf3_rxen Tff7b72= Te6edf3rxenTb4b4b4;
Te6edf3_txen Tff7b72= Te6edf3txenTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3setSPIFrequencyTb4b4b4(Tffa657uint32_t Te6edf3frequencyTb4b4b4)
Tb4b4b4{
Te6edf3_spiSettings Tff7b72= Te6edf3SPISettingsTb4b4b4(Te6edf3frequencyTb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3dumpRegistersTb4b4b4(Te6edf3StreamTff7b72& Te6edf3outTb4b4b4)
Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff128Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ff0xTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3printTb4b4b4(Te6edf3iTb4b4b4, Te6edf3HEXTb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ff: 0xTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3printlnTb4b4b4(Te6edf3readRegisterTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4, Te6edf3HEXTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3explicitHeaderModeTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3_implicitHeaderMode Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sx128xTff7b72:Tff7b72:Te6edf3implicitHeaderModeTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3_implicitHeaderMode Tff7b72= T79c0ff0x80Tb4b4b4;
Te6edf3setPacketParamsTb4b4b4(Te6edf3_preambleLengthTb4b4b4, Te6edf3_implicitHeaderModeTb4b4b4, Te6edf3_payloadLengthTb4b4b4, Te6edf3_crcModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3handleDio0RiseTb4b4b4(Tb4b4b4)
Tb4b4b4{
Tffa657uint8_t Te6edf3bufTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_GET_IRQ_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3executeOpcodeTb4b4b4(Te6edf3OP_CLEAR_IRQ_STATUS_8XTb4b4b4, Te6edf3bufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3bufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72& Te6edf3IRQ_PAYLOAD_CRC_ERROR_MASK_8XTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// received a packet
Te6edf3_packetIndex Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3rxbufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3executeOpcodeReadTb4b4b4(Te6edf3OP_RX_BUFFER_STATUS_8XTb4b4b4, Te6edf3rxbufTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3_rxPacketLength Tff7b72= Te6edf3rxbufTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Te6edf3_fifo_rx_addr_ptr Tff7b72= Te6edf3rxbufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3readBufferTb4b4b4(Te6edf3_packetTb4b4b4, Te6edf3_rxPacketLengthTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_onReceiveTb4b4b4) Tb4b4b4{
Te6edf3_onReceiveTb4b4b4(Te6edf3_rxPacketLengthTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3ISR_VECT Te6edf3sx128xTff7b72:Tff7b72:Te6edf3onDio0RiseTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3sx128x_modemTb4b4b4.Te6edf3handleDio0RiseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3sx128x Te6edf3sx128x_modemTb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────